package com.sushi.utils;

import java.util.ArrayList;
import java.util.List;


/**
 * @author Administrator
 */
public class FileConfigContent {

    private String packageContent;

    /**
     * 接口
     */
    public static final String INTERFACE = "interface";

    /**
     * 类
     */
    public static final String CLASS = "class";

    private String fileType;

    private final List<String> importContentList;

    /**
     * 开始大括号，含左空格
     */
    private final String start = " {\n";

    /**
     * 结束大括号
     */
    private final String end = "\n}";

    private String fileName;

    private String extendsContent;

    private final List<String> implementsContentList;

    private final List<String> autoWiredList;

    private final String commentBefore = "\n/**\n"
                                   + " * ";

    private String commentContent;

    private final String commentAfter = " * @author Administrator\n"
                                  + " */\n";

    private final List<String> otherContent;

    private final List<String> config;

    {
        importContentList = new ArrayList<>();
        config = new ArrayList<>();
        implementsContentList = new ArrayList<>();
        autoWiredList = new ArrayList<>();
        otherContent = new ArrayList<>();
    }

    /**
     * 设置包名
     * @param packageContent 包名，不含“;“
     */
    public void setPackageContent(String packageContent) {
        this.packageContent = packageContent;
    }

    /**
     * 设置继承目标
     * 仅支持一个，多个请自行拼接
     * @param extendsContent 所继承的类名或接口名
     */
    public void setExtendsContent(String extendsContent) {
        this.extendsContent = extendsContent;
    }

    /**
     * 设置备注信息
     * @param commentContent 备注信息
     */
    public void setCommentContent(String commentContent) {
        this.commentContent = commentContent;
    }

    /**
     * 设置文件名称
     * @param fileName 文件名，如：Person
     */
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    /**
     * 设置文件类型
     * @param fileType 指定文件类型，不带“.”，如：java、txt
     */
    public void setFileType(String fileType) {
        this.fileType = fileType;
    }

    /**
     * 添加导入内容
     * @param newImport 不带"；"
     */
    public void addImport(String newImport) {
        importContentList.add(newImport);
    }

    /**
     * 添加其他内容
     * @param newOtherContent 其他内容，不带"；"
     */
    public void addOtherContent(String newOtherContent) {
        otherContent.add(newOtherContent);
    }

    /**
     * 添加 配置注解，最好能和import配合
     * @param newConfig 带@，方便区分
     */
    public void addConfig(String newConfig) {
        config.add(newConfig);
    }

    /**
     * 添加 实现接口
     * @param impl 要实现的接口，如：Serializable
     */
    public void addImplements(String impl) {
        implementsContentList.add(impl);
    }

    /**
     * 添加 自动装配对象
     * @param newWired 自动装配的 接口/类 名，如：PersonService
     */
    public void addAutowired(String newWired) {
        autoWiredList.add(newWired);
    }

    /**
     * 获取 包信息 内容
     * @return 文件内容 字符串
     */
    private String getPackageContent() {
        return "package " + packageContent + ";\n\n";
    }

    /**
     * 获取 继承 内容
     * @return 文件内容 字符串
     */
    private String getExtendsContent() {
        return ObjectUtil.isNotEmpty(extendsContent) && extendsContent.length() > 0 ? " extends " + extendsContent : "";
    }

    /**
     * 获取 实现部分 内容
     * @return 文件内容 字符串
     */
    private String getImplementsContentList() {
        String join = StringUtil.join(implementsContentList, ",");
        return join.length() > 0 ? " implements " + join : "";
    }

    /**
     * 获取 备注部分 内容
     * @return 文件内容 字符串
     */
    private String getCommentContent() {
        return commentBefore + commentContent + "\n"
               + " * @date " + TimeUtil.getFormatTime(System.currentTimeMillis(), TimeUtil.Y_M_D) + "\n"
               + " * @time " + TimeUtil.getFormatTime(System.currentTimeMillis(), TimeUtil.H_M_S) + "\n"
               + commentAfter;
    }

    /**
     * 获取 导入部分 内容
     * @return 文件内容 字符串
     */
    private String getImportContent() {
        StringBuilder builder = new StringBuilder();
        if (ObjectUtil.isNotEmpty(importContentList)) {
           importContentList.forEach(element -> builder.append("import ").append(element).append(";\n"));
        }
        return builder.toString();
    }

    /**
     * 获取 注解配置 内容
     * @return 文件内容 字符串
     */
    private String getConfigContent() {
        StringBuilder builder = new StringBuilder();
        if (ObjectUtil.isNotEmpty(config)) {
            config.forEach(element -> builder.append(element).append("\n"));
        }
        return builder.toString();
    }

    /**
     * 获取 文件名位置 内容
     * @return 文件内容 字符串
     */
    private String getFileNameContent() {
        return "public " + fileType + " " + fileName;
    }

    /**
     * 获取 其他 内容
     * @return 文件内容 字符串
     */
    private String getOtherContent() {
        StringBuilder builder = new StringBuilder();
        if (ObjectUtil.isNotEmpty(otherContent)) {
            otherContent.forEach(content ->
                    builder.append("\n    ").append(content).append(";\n"));
        }
        return builder.toString();
    }

    /**
     * 获取 自动装配 内容
     * @return 文件内容 字符串
     */
    private String getAutowiredContent() {
        StringBuilder builder = new StringBuilder();
        if (ObjectUtil.isNotEmpty(autoWiredList)) {
            autoWiredList.forEach(wired -> {
                builder.append("\n\t@Autowired\n\t").append("private ")
                        .append(wired).append(" ");
                // 处理名字
                String first = wired.substring(0, 1);
                String remain = wired.substring(1);
                String lowerCase = first.toLowerCase();
                builder.append(lowerCase).append(remain).append(";\n");
            });
        }
        return builder.toString();
    }


    /**
     * 获取整个文件字符串
     * @return 返回文件内容 字符串
     */
    public String getFileContent() {
        return getPackageContent() + getImportContent() + getCommentContent() + getConfigContent()
               + getFileNameContent() + getExtendsContent() + getImplementsContentList()
               + start + getAutowiredContent() + getOtherContent() + end;
    }

}
